2026-10-15T08:28:28.0604179Z ##[group]Run npm run test:deploy
2026-10-15T08:28:28.0604205Z [36;1mnpm run test:deploy[0m
2026-10-15T08:28:28.0604215Z shell: /usr/bin/bash -e {0}
2026-10-15T08:28:28.0604222Z env:
2026-10-15T08:28:28.0604228Z   CARGO_TERM_COLOR: never
2026-10-15T08:28:28.0604292Z   CLOUDFLARE_ACCOUNT_ID: 1e6f2cffa3f445920836e8ebe446bb58
2026-10-15T08:28:28.0604300Z   WRANGLER_SEND_METRICS: false
2026-10-15T08:28:28.0604307Z ##[endgroup]
2026-10-15T08:28:28.1525128Z 
2026-10-15T08:28:28.1525221Z > test:deploy
2026-10-15T08:28:28.1525243Z > node --test "scripts/deploy/*.test.mjs"
2026-10-15T08:28:28.1525253Z 
2026-10-15T08:28:28.2445373Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (1.445621ms)
2026-10-15T08:28:28.2445439Z ✔ the toolchain is read from rustc -V (0.20932ms)
2026-10-15T08:28:28.2445499Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.1753ms)
2026-10-15T08:28:28.2445573Z ✔ a unit's hash is read from its files and folders (0.17539ms)
2026-10-15T08:28:28.2445625Z ✔ only the units the build did not use are pruned (2.017762ms)
2026-10-15T08:28:29.6892095Z error: no matching package named `base64` found
2026-10-15T08:28:29.6892153Z location searched: crates.io index
2026-10-15T08:28:29.6892236Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-15T08:28:29.6892303Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-15T08:28:29.6892352Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-15T08:28:29.6892402Z ✔ the manifest matches every wrangler config in the repository (21.967958ms)
2026-10-15T08:28:29.6892449Z ✔ every wrangler.jsonc is found, and only checked-in ones (15.100263ms)
2026-10-15T08:28:29.6892543Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (20.758237ms)
2026-10-15T08:28:29.6892614Z ✔ stages follow bindings: nothing binds to a unit that ships after it (0.548691ms)
2026-10-15T08:28:29.6892747Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (0.862871ms)
2026-10-15T08:28:29.6892816Z ✔ Rust workers build with the shared script and the same wasm-opt level (0.79719ms)
2026-10-15T08:28:29.6892880Z ✔ shared crates and packages are read from workspace metadata (0.25018ms)
2026-10-15T08:28:29.6892961Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.80404ms)
2026-10-15T08:28:29.6893006Z ✔ services/runner/base.json records the base its folder builds (9.715608ms)
2026-10-15T08:28:29.6893051Z ✔ an image's hash ignores line endings, and its tags say what they are (143.006252ms)
2026-10-15T08:28:29.6893093Z ✔ only the lockfile entries the runner is built from name its image (0.26792ms)
2026-10-15T08:28:29.6893134Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (16.807244ms)
2026-10-15T08:28:29.6893413Z ✔ the registry is asked for an image's manifest, without Docker (0.789231ms)
2026-10-15T08:28:29.6893455Z ✔ a push counts only when it ends with a digest, and is tried again (0.609181ms)
2026-10-15T08:28:29.6893500Z ✔ a static Linux binary is told from a dynamic one (0.61414ms)
2026-10-15T08:28:29.6893583Z ﹣ path dependencies agree with Cargo's own resolved graph (797.93256ms) # cargo metadata could not resolve offline
2026-10-15T08:28:29.6893656Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (50.678504ms)
2026-10-15T08:28:29.6893723Z ✔ a shared crate's change reaches every unit built from it, and no other (0.52551ms)
2026-10-15T08:28:29.6893785Z ✔ a shared package's change reaches what imports it (0.24613ms)
2026-10-15T08:28:29.6894824Z ✔ a crate's tests, benches and examples deploy nothing (0.542241ms)
2026-10-15T08:28:29.6894921Z ✔ a Rust file compiled only for tests is found from what declares it (0.925751ms)
2026-10-15T08:28:29.6895310Z ✔ this repository's test-only sources are read from git (141.4019ms)
2026-10-15T08:28:29.6895408Z ✔ decide: a change only to tests deploys nothing (0.885431ms)
2026-10-15T08:28:29.6895476Z ✔ own folders, declared inputs and root files (0.416591ms)
2026-10-15T08:28:29.6895522Z ✔ a Cargo.lock change reaches only crates that use what changed (0.34912ms)
2026-10-15T08:28:29.6895561Z ✔ a package-lock change reaches through workspace links (0.45774ms)
2026-10-15T08:28:29.6895598Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.24847ms)
2026-10-15T08:28:29.6895643Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.11846ms)
2026-10-15T08:28:29.6895960Z ✔ decide: Cargo.lock counts only where it reaches (0.366061ms)
2026-10-15T08:28:29.6896005Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.19467ms)
2026-10-15T08:28:29.6896047Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (0.726051ms)
2026-10-15T08:28:29.6896086Z ✔ units are picked by short name, folder or Worker name (0.37588ms)
2026-10-15T08:28:29.6896120Z ✔ a CI job installs only what its units need (0.798161ms)
2026-10-15T08:28:29.6896165Z ✔ a deploy is annotated with its commit, and read back (0.18452ms)
2026-10-15T08:28:29.6896229Z ✔ the live commit: the live version's, looking through secret changes (0.26196ms)
2026-10-15T08:28:29.6896293Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.27001ms)
2026-10-15T08:28:29.6896355Z ✔ the API's answers: the live commit as Wrangler's would give it (0.77311ms)
2026-10-15T08:28:30.0670755Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (501.952428ms)
2026-10-15T08:28:30.2523150Z ✔ the API is used only with the token Wrangler would be given (0.338641ms)
2026-10-15T08:28:30.2523304Z ✔ pending migrations: the folder's files less the names in d1_migrations (1.672002ms)
2026-10-15T08:28:30.2523395Z ✔ the pool runs everything, no more than its limit at once (16.148054ms)
2026-10-15T08:28:30.2523497Z ✔ self-hosting builds every Rust service the manifest says it runs (0.51419ms)
2026-10-15T08:28:30.2523560Z ✔ the self-hosting architecture page names every unit (0.254531ms)
2026-10-15T08:28:30.2523613Z ✔ the architecture's services page names every unit, with the services it binds to (2.768332ms)
2026-10-15T08:28:30.2523679Z ✔ resolveStack works on a manifest with no workspace crates or packages (1.895192ms)
2026-10-15T08:28:30.2523738Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.281661ms)
2026-10-15T08:28:30.2523882Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (1.595071ms)
2026-10-15T08:28:30.2523947Z ✔ a failed wrangler command is reported by its error, not its trace (0.22216ms)
2026-10-15T08:28:30.2524029Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.414501ms)
2026-10-15T08:28:30.2524091Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.841341ms)
2026-10-15T08:28:30.2524131Z ✔ the deploy tool itself parses: a test that never imports it would not notice (29.962395ms)
2026-10-15T08:28:30.4805455Z ✔ the statements are all there (0.942961ms)
2026-10-15T08:28:30.4821124Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (37.852402ms)
2026-10-15T08:28:30.4821207Z ✔ revoking an unused invite gives it back; an expired one never counted (73.377983ms)
2026-10-15T08:28:30.4821434Z ✔ a used invite is spent: revoking it does nothing and it still counts (36.113561ms)
2026-10-15T08:28:30.4822957Z ✔ a pending invite for the same address is found; a revoked one is not (43.000257ms)
2026-10-15T08:28:30.4824081Z ✔ staff grants add to the twenty and can take some back (49.610532ms)
2026-10-15T08:28:30.4824807Z ✔ signing up from the link spends the invite once and records who invited whom (47.619711ms)
2026-10-15T08:28:30.5295804Z ✔ a body that broke off is worth another try, a lockfile out of step is not (1.091261ms)
2026-10-15T08:28:30.5298981Z ✔ an install that ends without saying why, or stalls, is tried again (0.160931ms)
2026-10-15T08:28:30.5299889Z ✔ a dropped connection is tried again until the install passes (0.807351ms)
2026-10-15T08:28:30.5300441Z ✔ a real error fails at once (0.19988ms)
2026-10-15T08:28:30.5300941Z ✔ it gives up after its tries, with npm's exit code (0.18157ms)
2026-10-15T08:28:30.5301375Z ✔ a stalled install is run again (0.14819ms)
2026-10-15T08:28:30.6630408Z ✔ webhooks: the hourly purge deletes old deliveries by time (1.747472ms)
2026-10-15T08:28:30.6673767Z ✔ billing: this month's users are read from an index, not the ledger (48.702121ms)
2026-10-15T08:28:30.6680405Z ✔ events: a repository's events of one type, newest first, page by page (3.160952ms)
2026-10-15T08:28:30.6681839Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (13.889282ms)
2026-10-15T08:28:30.6684518Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (2.837542ms)
2026-10-15T08:28:30.6686918Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (2.689033ms)
2026-10-15T08:28:30.6689925Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (2.551952ms)
2026-10-15T08:28:30.7560464Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (3.812264ms)
2026-10-15T08:28:30.7580905Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.43486ms)
2026-10-15T08:28:30.7580988Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (0.734581ms)
2026-10-15T08:28:30.7581040Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.24681ms)
2026-10-15T08:28:30.7591187Z ✔ image references and bearer challenges are read (0.535211ms)
2026-10-15T08:28:30.7598618Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (24.16809ms)
2026-10-15T08:28:30.7598918Z ✔ a base that is not where it should be, or not what base.json says, stops it (1.02607ms)
2026-10-15T08:28:30.7599119Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (2.156692ms)
2026-10-15T08:28:30.8094475Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-15T08:28:30.8318422Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-15T08:28:30.8345986Z ✔ fields read numbers, ranges, lists and steps (1.522072ms)
2026-10-15T08:28:30.8360728Z ✔ the services' crons match when hosted g1t's would fire (1.537931ms)
2026-10-15T08:28:30.8380617Z ✔ what is due is each matching cron of each service (0.350931ms)
2026-10-15T08:28:30.8380704Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (23.095199ms)
2026-10-15T08:28:30.9191240Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (25.659421ms)
2026-10-15T08:28:30.9203525Z ✔ an announcement that fails is a warning, never a failed deploy (0.73114ms)
2026-10-15T08:28:30.9206353Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (0.75438ms)
2026-10-15T08:28:30.9221492Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (0.528171ms)
2026-10-15T08:28:30.9313871Z ℹ tests 92
2026-10-15T08:28:30.9314014Z ℹ suites 0
2026-10-15T08:28:30.9314031Z ℹ pass 91
2026-10-15T08:28:30.9314166Z ℹ fail 0
2026-10-15T08:28:30.9314301Z ℹ cancelled 0
2026-10-15T08:28:30.9314405Z ℹ skipped 1
2026-10-15T08:28:30.9314413Z ℹ todo 0
2026-10-15T08:28:30.9314567Z ℹ duration_ms 2746.1536
